<?php
namespace Models;

require_once('\Models\LoginModel.php');
require_once('\Models\Database.php');
require_once('\Models\DBConfigTest.php');
require_once('\Models\User.php');
require_once('\Models\Password.php');
require_once('\Models\Image.php');
require_once('\Models\Token.php');
require_once('\Common\Validator.php');
require_once('\Common\DBTables.php');
require_once('\Models\UserCatalog.php');
require_once('\Models\AlbumCatalog.php');
require_once('\Models\ImageCatalog.php');
require_once('\Models\ManageUsersModel.php');
require_once('\Models\ManageAlbumsModel.php');
require_once('\Views\PageView.php');

class Tests
{
	private $_db;
	private $_pv;
	private $_dbt;

	public function TestLoginModel(\Models\Database $db)
	{
		$output = array();
		$lm = new \Models\LoginModel();
		$pv = new \Views\PageView();
		
		// Börjar med att logga ut
		$lm->Logout();
		
		// Om vi fortfarande är inloggade är IsLoggedIn felimplementerad
		if($lm->IsLoggedIn() == true)
			$output[] = "FEL 1: Användaren är fortfarande inloggad trots att den loggats ut";	
		
		// Om inloggning med felaktiga uppgifter lyckas är Login felimplementerad
		if($lm->Login($db, "admin", "1234") == true)
			$output[] = "FEL 2: Inloggning lyckades med felaktiga parametrar";
		
		// Om inloggning med rätt uppgifter misslyckas är Login felimplementerad
		if($lm->Login($db, "fille", "drpepper") == false)
			$output[] = "FEL 3: Inloggning misslyckades med korrekta parametrar";
		
		// Ifall vi fortfarande inte är inloggade
		if($lm->IsLoggedIn() == false)
			$output[] = "FEL 4: Användaren är fortfarande inte inloggad efter försök med korrekta parametrar";
		
		// Eka ut felmeddelanden
		echo $pv->printErrors($output);
		
		// Om det finns felmeddelanden har testet ej gått igenom
		if(count($output) > 0)
			return false;
		else
			return true;
	}

	public function TestDatabase(\Models\Database $db)
	{
		$output = array();
		$pv = new \Views\PageView();
		
		$nrOfPostBefore = $db->SelectOne("SELECT COUNT(*) FROM user");
		
		// Skapa unik användare för att inte få undantag kastade
		$statement = $db->Prepare("
		INSERT INTO 
		user(userTypeId,userName,firstName,lastName,password,email) 
		VALUES (1,'user".time()."','John','Doe','testing1234','user".time()."@gmail.com')");
		
		$db->Insert($statement);
		
		$nrOfPostAfter = $db->SelectOne("SELECT COUNT(*) FROM user");
		
		if ($nrOfPostBefore +1 != $nrOfPostAfter)
			$output[] = "FEL: Prepare eller Insert misslyckades";
		
		if ($db->SelectOne("SELECT COUNT(*) FROM user") == 0)
			$output[] = "FEL: Misslyckades med att välja en rad ur databasen";
		
		if ($db->Close() == false)
			$output[] = "FEL: Kunde inte stänga databasuppkopplingen";
		
		// Eka ut felmeddelanden
		echo $pv->printErrors($output);
		
		if(count($output)>0)
			return false;
		else
			return true;
	}
	
	public function TestUser()
	{
		$output = array();
		$pv = new \Views\PageView();		 
		
		if(\Common\Validator::validateNumber("ett"))
			$output[] = "FEL: Ett icke-nummer valideras korrekt som nummer.";
	
		if(!\Common\Validator::validateNumber(1))
			$output[] = "FEL: Ett korrekt nummer valideras inkorrekt";
		
		if(!\Common\Validator::validatePassword("admin1234", 6))
			$output[] = "FEL: Ett korrekt lösenord validerades ej";
		
		if(\Common\Validator::validatePassword("admin", 6))
			$output[] = "FEL: Ett för kort lösenord validerades korrekt";
		
		if(\Common\Validator::validateString(""))
			$output[] = "FEL: Ett felaktigt användarnamn validerades ok";
		
		if(!\Common\Validator::validateString("admin"))
			$output[] = "FEL: Korrekt användarnamn validerades ej";
		
		// $userId får inte vara "test"
		$user = new \Models\User("test", 1, "john-doe", "John", "Doe");
		
		if($user->isValid)
			$output[] = "FEL: Objektet innehåller fel och ska ej vara valit";
		
		$user = new \Models\User(1, 1, "john-doe", "John", "Doe");
		if(!$user->isValid)
			$output[] = "FEL: Objektet är inte valit trots det initierats med korrekta parametrar";
		
		// Eka ut felmeddelanden
		echo $pv->printErrors($output);
		
		if(count($output)>0)
			return false;
		else
			return true;
	}
	
	public function TestUserCatalog(\Models\Database $db)
	{
		$output = array();
		$uc = new \Models\UserCatalog();
		$pv = new \Views\PageView();
		
		if(!$db->ConnectTest(new \Models\DBConfigTest()))
			return false;
		 
		$allUsers = $uc->getUsers($db);
		
		if(get_class($allUsers) != "Models\UserArray")
			$output[] = "FEL: UserRegister->getUsers() returnerade " . get_class($allUsers);
			
		// Eka ut felmeddelanden
		echo $pv->printErrors($output);
		
		if(count($output)>0)
			return false;
		else
			return true;
	}
	
	public function TestManageUsersModel(\Models\Database $db)
	{
		$output = array();
		$pv = new \Views\PageView();
		$dbt = new \Common\DBTables();
		
		$mum = new \Models\ManageUsersModel($db);
		
		// Lägg till befintlig användare
		$errors = $mum->createUser(1, "test", "John", "Doe", "user".time()."@gmail.com", "testing1234","testing1234", 6);
		
		if(count($errors) == 0)
			$output[] = "FEL: Det gick att lägga till en användare vars namn redan finns redan i DB";
		
		// Ta bort användare
		if(!$mum->deleteUser("",'test'))
			$output[] = "FEL: Det gick inte att ta bort användaren test ur DB";
		
		if($db->alreadyExists($dbt->userTable, $dbt->userNameField, "test"))
			$output[] = "FEL: Användaren test finns i DB efter borttagning";
		
		// Lägg till test-användaren igen
		$mum->createUser(1, "test", "John", "Doe", "user".time()."@gmail.com", "testing1234","testing1234", 8);
		
		if(count($mum->errors)>0)
			$output[] = "FEL: Det gick inte att lägga till en användare i DB";
		
		// Eka ut felmeddelanden
		echo $pv->printErrors($output);
		
		if(count($output)>0)
			return false;
		else
			return true;
	}

	public function TestManageAlbumModel(\Models\Database $db)
	{
		$output = array();
		$lm = new \Models\LoginModel();
		$pv = new \Views\PageView();
		$ic = new \Models\ImageCatalog();
		
		if(!$db->ConnectTest(new \Models\DBConfigTest()))
			return false;
		 
		$mam = new \Models\ManageAlbumsModel($db);
		
		if($lm->Login($db, "fille", "drpepper") == false)
			$output[] = "FEL 1: Inloggning misslyckades";
		
		// Lagrar felmeddelanden i array, om några
		$albumId = $mam->createAlbum($lm->getUserId(), "Testalbum", 2012, "Finfint");
		
		// Eka ut felmeddelanden
		if(count($mam->errors)>0)
		{
			echo $pv->printErrors($mam->errors);
			$output[] = "FEL 2: Kunde inte skapa albumet";
		}
		
		// Lagrar felmeddelanden i array, om några
		$album = new \Models\Album($albumId, 2, "Testalbum 2", 2012, "Finfint"); 
		
		if(!$mam->updateAlbum($album))
		{
			$output[] = "FEL 3: Kunde inte uppdatera albumet";
			echo $pv->printErrors($mam->errors);
		}
		
		/*
		// Lägg till bild till album
		$image = new \Models\Image(1, $albumId, "Some picture...", "test.jpg", "thumbs/test.jpg");
		$imageId = $mam->addImage($image);
		
		if($imageId == 0)
		{
			$output[] = "FEL 4: Kunde inte lägga till bild";
			echo $pv->printErrors($mam->errors);
		}
		
		// Uppdatera bilder
		$images = $ic->getImages($db, $albumId);
		$updatedImages = new \Models\ImageArray();
		
		$imagesToDelete = array();
		
		foreach ($images as $updatedImage)
		{
			// spara bildId att ta bort senare
			$imagesToDelete[] = $updatedImage->ImageId();
			
			$img = new \Models\Image($updatedImage->ImageId(), $albumId, "Som updated picture...", "/uploads", "/thumbs");
			$updatedImages->add($img);
		}
		
		if(!$mam->updateImages($updatedImages))
		{
			$output[] = "FEL 5: Kunde inte uppdatera bilder";
			echo $pv->printErrors($mam->errors);
		}
		
		if(!$mam->deleteImages($imagesToDelete, $albumId))
		{
			$output[] = "FEL 5: Kunde inte ta bort bilderna";
			echo $pv->printErrors($mam->errors);
		}
		*/
		// Om det inte gick att ta bort ett befintligt
		if(!$mam->deleteAlbum($albumId))
		{
			$output[] = "FEL 6: Kunde inte ta bort vissa bilder i albumet";
			echo $pv->printErrors($mam->errors);
		}
		
		// Om det går att ta bort ett album som inte finns
		if($mam->deleteAlbum(102223))
		{
			$output[] = "FEL 7: Tog bort ett album som inte existerar";
			echo $pv->printErrors($mam->errors);
		}
		
		
		// Eka ut felmeddelanden
		echo $pv->printErrors($output);
		
		if(count($output)>0)
			return false;
		else
			return true;
	}
	
	public function TestPassword()
	{
		$output = array();
		$pw = new \Models\Password();
		$pv = new \Views\PageView();
		
		$hash1 = $pw->hashPassword("testlosen");
		$hash2 = $pw->hashPassword("testlosen");
		
		if($hash1 == $hash2)
			$output[] = "FEL 1: hashPassword returnerar inte unika värden";
		
		if(!$pw->checkPassword($hash1, "testlosen"))
			$output[] = "FEL 2: checkPassword verifierar inte korrekt lösenord";
		
		if($pw->checkPassword($hash1, "fellosen"))
			$output[] = "FEL 3: checkPassword verifierar ett inkorrekt lösenord";
		
		// Eka ut felmeddelanden
		echo $pv->printErrors($output);
		
		if(count($output)>0)
			return false;
		else
			return true;
	}
	
	public function TestImage()
	{
		$output = array();
		$pv = new \Views\PageView();
		
		$img = new \Models\Image(1, 2, "Lorem ipsum", "/uploads/", "/uploads/thumbs/");
		
		if(!$img->isValid)
			$output[] = "FEL 1: Image validerar ej med korrekta parametrar";
		
		$img = new \Models\Image("test", 2, "Lorem ipsum", "/uploads/", "/uploads/thumbs/");
		
		if($img->isValid)
			$output[] = "FEL 2: Image validerar med inkorrekta parametrar";
		
		// Eka ut felmeddelanden
		echo $pv->printErrors($output);
		
		if(count($output)>0)
			return false;
		else
			return true;
	}
	
	public function TestImageCatalog(\Models\Database $db)
	{
		$output = array();
		$ic = new \Models\ImageCatalog();
		$pv = new \Views\PageView();
		
		if(!$db->ConnectTest(new \Models\DBConfigTest()))
			return false;
		 
		$allImages = $ic->getImages($db);
		
		if($allImages != false)
		{
			if(get_class($allImages) != "Models\ImageArray")
				$output[] = "FEL: ImageCatalog->getImages() returnerade " . get_class($allImages);
		}
		else
			$output[] = "FEL: Inga bilder finns i DB";
		
			
		// Eka ut felmeddelanden
		echo $pv->printErrors($output);
		
		if(count($output)>0)
			return false;
		else
			return true;
	}
	
	public function TestAlbum()
	{
		$output = array();
		$pv = new \Views\PageView();
		
		$album = new \Models\Album(2, 2, "Testalbum", 2012, "Lorem ipsum");
		
		if(!$album->isValid)
			$output[] = "FEL 1: Album validerar ej med korrekta parametrar";
		
		$album = new \Models\Album("test", 2, "Testalbum", 2012, "Lorem ipsum");
		
		if($album->isValid)
			$output[] = "FEL 2: Album validerar med inkorrekta parametrar";
		
		// Eka ut felmeddelanden
		echo $pv->printErrors($output);
		
		if(count($output)>0)
			return false;
		else
			return true;
	}
	
	public function TestAlbumCatalog(\Models\Database $db)
	{
		$output = array();
		$ac = new \Models\AlbumCatalog();
		$pv = new \Views\PageView();
		
		if(!$db->ConnectTest(new \Models\DBConfigTest()))
			return false;
		 
		$allAlbums = $ac->getAlbums($db);
		
		if(get_class($allAlbums) != "Models\AlbumArray")
			$output[] = "FEL: AlbumCatalog->getAlbums() returnerade " . get_class($allAlbums);
			
		// Eka ut felmeddelanden
		echo $pv->printErrors($output);
		
		if(count($output)>0)
			return false;
		else
			return true;
	}
	
	public function TestToken()
	{
		$output = array();
		$pv = new \Views\PageView();
		
		$token = new \Models\Token(1, 2, "sjdfklsdjfklsdjfkl", "127.0.0.1");
		
		if(!$token->isValid)
			$output[] = "FEL 1: Token validerar ej med korrekta parametrar";
		
		$token = new \Models\Token("test", 2, "sjdfklsdjfklsdjfkl", "127.0.0.1");
		
		if($token->isValid)
			$output[] = "FEL 2: Token validerar med inkorrekta parametrar";
		
		// Eka ut felmeddelanden
		echo $pv->printErrors($output);
		
		if(count($output)>0)
			return false;
		else
			return true;
	}
}

?>